#include <CtrlLib/CtrlLib.h>

using namespace Upp;

#include "Dialogs.h"

extern PostgreSQLSession pg_session;

AltasAfiliadosMes::AltasAfiliadosMes()
{
	CtrlLayout(*this, "Historial de altas realizadas en el mes");
	
	exportar_btn.SetImage(CentroJyPImg::file_export16x16());
	limpiar_btn.SetImage(CentroJyPImg::limpiar_solicitudes());
	quitar_afiliado_btn.SetImage(CentroJyPImg::remove_user_16x16());
	salir_btn.SetImage(CentroJyPImg::salir());
	
	lista_altas.SetSession(pg_session);
	lista_altas.SetTable(ALTA);
	lista_altas.AddColumn("Nro. de Socio").NoEdit().Sorting();
	lista_altas.AddColumn("Documento").NoEdit().Sorting();
	lista_altas.AddColumn("Apellido/s y Nombre/s").NoEdit().Sorting();
//	lista_altas.AddColumn("Nombre/s").NoEdit();
		
	exportar_btn <<= THISBACK(ExportarAltas);
	quitar_afiliado_btn <<= THISBACK(QuitarAfiliado);
	limpiar_btn <<= THISBACK(LimpiarLista);
	salir_btn <<= THISBACK(Salir);
	
	if (! (SQL * Select(NRO_SOCIO_ALTA).From(ALTA))) {
		Exclamation(SQL.GetLastError());
		return;
	}
	
	Sql sql(pg_session);
	while (SQL.Fetch()) {
		if (! (sql * Select(NRO_SOCIO_A,DNI_A,APELLIDOS_A).From(AFILIADO).Where(SQL[NRO_SOCIO_ALTA] == NRO_SOCIO_A))) {
			Exclamation(sql.GetLastError());
			return;
		}
		
		while(sql.Fetch())
			lista_altas.Add(sql[NRO_SOCIO_A],sql[DNI_A],sql[APELLIDOS_A]);
	}
	
	HabilitarBotones();
}

/**
 Permite exportar las altas que se encuentran registradas a un archivo txt. Además, una vez que 
 se ha exportado correctamente, se pregutna si se desea limpiar el contenido de las altas.
*/
void AltasAfiliadosMes::ExportarAltas()
{
	String texto; // Es el string completo que se va a guardar en el archivo.
	
	for (int i = 0 ; i < lista_altas.GetCount() ; i++) {
		if (! (SQL * Select(BENEFICIO_A,LEY_A,NRO_SOCIO_A,SUB_A,CDGO_DTO_A,CUOTA_A).From(AFILIADO)
				.Where(NRO_SOCIO_A == lista_altas.Get(i,0)))) {
			Exclamation(SQL.GetLastError());
			return;
		}
			
		String linea; // Es solo una linea del string completo.
		while (SQL.Fetch()) {
			linea << AsString(SQL[BENEFICIO_A]) << AsString(SQL[LEY_A]) << AsString(SQL[NRO_SOCIO_A]) << AsString(SQL[SUB_A]);
			linea << AsString(SQL[CDGO_DTO_A]) << "0000";
			linea << AsString(SQL[CUOTA_A]);
			linea << "I";
			for (int i = 0 ; i < 52 ;i++)
				linea << "0";			
			linea << "\r\n";
		}
		texto << linea;
		
	}

	FileSel sel;
	sel.Type("Archivo txt", "*.txt");
	if (! (sel.ExecuteSaveAs("Seleccione donde quiere almacenar el archivo")))
		return;
	
	String dir = sel.Get();
	
	if (! SaveFile(dir, texto))
		return;
	
	Hide();
	
	if (PromptYesNo("El archivo se ha exportado correctamente. ¿Quiere limpiar el archivo de altas? NO se puede revertir la decisión.")) {
		if (! (SQL * Delete(ALTA))) {
			Exclamation(SQL.GetLastError());
			return;
		}
		PromptOK("El archivo de altas se ha limpiado correctamente");
	}
	
	Close();
	HabilitarBotones();
}

/**
 Opción para quitar un afiliado de la lista de altas.
*/
void AltasAfiliadosMes::QuitarAfiliado()
{	
	if (lista_altas.IsCursor() && PromptYesNo("¿Desea quitar de la lista de altas este afiliado?")) {
		Sql sql(pg_session);
		SqlId ALL("*");
		if (! (SQL * Select(ALL).From(ALTA).Where(NRO_SOCIO_ALTA == lista_altas.GetKey()))) {
			Exclamation(SQL.GetLastError());
			return;
		}
		while(SQL.Fetch()) {
			if (! (sql * Delete(ALTA).Where(NRO_SOCIO_ALTA == lista_altas.GetKey()))) {
				Exclamation(sql.GetLastError());
				return;
			}
		}
		lista_altas.Query();
		lista_altas.GoEndPostQuery();
	}
	HabilitarBotones();
}

/**
 Acción para limpair la lista de altas.
*/
void AltasAfiliadosMes::LimpiarLista()
{
	if (PromptYesNo("¿Quiere limpiar el archivo de altas? NO se puede revertir la decisión.")) {
		if (! (SQL * Delete(ALTA))) {
			Exclamation(SQL.GetLastError());
			return;
		}
		PromptOK("El archivo de altas se ha limpiado correctamente");
		lista_altas.Query();
		lista_altas.GoEndPostQuery();
	}
	HabilitarBotones();
}

/**
 Función para Habilitar los botones de exportar, quitar y limpiar.
*/
void AltasAfiliadosMes::HabilitarBotones()
{
	if (lista_altas.Get(0,0).IsNull()) {
		exportar_btn.Disable();
		quitar_afiliado_btn.Disable();
		limpiar_btn.Disable();
	}
	else {
		exportar_btn.Enable();
		quitar_afiliado_btn.Enable();
		limpiar_btn.Enable();
	}
}

/**
 Opción para salir de la ventana de bajas.
*/
void AltasAfiliadosMes::Salir()
{
	Break();
}

//==============================================================================================

/**
 Opción para dar de baja un afiliado.
*/
BajaAfiliadoMes::BajaAfiliadoMes()
{
	CtrlLayout(*this, "Historial de bajas realizadas en el mes");
	
	exportar_btn.SetImage(CentroJyPImg::file_export16x16());
	limpiar_btn.SetImage(CentroJyPImg::limpiar_solicitudes());
	quitar_afiliado_btn.SetImage(CentroJyPImg::remove_user_16x16());
	salir_btn.SetImage(CentroJyPImg::salir());
	
	lista_bajas.SetSession(pg_session);
	lista_bajas.SetTable(BAJA,NRO_SOCIO_B);
	lista_bajas.AddColumn("Nro. de Socio").NoEdit().Sorting();
	lista_bajas.AddColumn("Documento Identidad").NoEdit().Sorting();
	lista_bajas.AddColumn("Apellido/s y Nombre/s").NoEdit().Sorting();
//	lista_bajas.AddColumn("Nombre/s").NoEdit().Sorting();
	lista_bajas.AddColumn("Nro. de Afiliado").NoEdit().Sorting();

	if (! (SQL * Select(NRO_SOCIO_B,DNI_B,APELLIDOS_B,NRO_AFILIADO_B).From(BAJA))) {
		Exclamation(SQL.GetLastError());
		return;
	}
	while (SQL.Fetch())
		lista_bajas.Add(SQL[NRO_SOCIO_B],SQL[DNI_B],SQL[APELLIDOS_B],SQL[NRO_AFILIADO_B]);
	
	HabilitarBotones();
	
	exportar_btn <<= THISBACK(ExportarBajas);
	quitar_afiliado_btn <<= THISBACK(QuitarAfiliado);
	limpiar_btn <<= THISBACK(LimpiarLista);
	salir_btn <<= THISBACK(Salir);
}

/**
 Opción para exportar las bajas a un archivo txt.
*/
void BajaAfiliadoMes::ExportarBajas()
{
	if (lista_bajas.IsCursor()) {
		String texto; // Es el string completo que se va a guardar en el archivo.
		
		for (int i = 0 ; i < lista_bajas.GetCount() ; i++) {
			if (! (SQL * Select(BENEFICIO_B,LEY_B,NRO_SOCIO_B,SUB_B,CDGO_DTO_B,CUOTA_B).From(BAJA)
					.Where(NRO_SOCIO_B == lista_bajas.Get(i,0)))) {
				Exclamation(SQL.GetLastError());
				return;
			}
				
			String linea; // Es solo una linea del string completo.
			while (SQL.Fetch()) {
				linea << AsString(SQL[BENEFICIO_B]) << AsString(SQL[LEY_B]) << AsString(SQL[NRO_SOCIO_B]) << AsString(SQL[SUB_B]);
				linea << AsString(SQL[CDGO_DTO_B]) << "0000";
				linea << AsString(SQL[CUOTA_B]);
				linea << "I";
				for (int i = 0 ; i < 52 ;i++)
					linea << "0";
				linea << "\r\n";
			}
			texto << linea;
		}
	
		FileSel sel;
		sel.Type("Archivo txt", "*.txt");
		if (! (sel.ExecuteSaveAs("Seleccione donde quiere almacenar el archivo")))
			return;
		
		String dir = sel.Get();
		
		if (! SaveFile(dir, texto))
			return;
		
		Hide();
		
		if (PromptYesNo("El archivo se ha exportado correctamente. ¿Quiere limpiar el listado de bajas? NO se puede revertir la decisión.")) {
			if (! (SQL * Delete(BAJA))) {
				Exclamation(SQL.GetLastError());
				return;
			}
			PromptOK("El archivo de bajas se ha limpiado correctamente");
		}
		
		Close();
	}
	HabilitarBotones();
}

/**
 Opción que permite quitar de la lista de bajas a un afiliado y retornarlo a la lista de afialiado.
*/
void BajaAfiliadoMes::QuitarAfiliado()
{
	if (lista_bajas.IsCursor() && PromptYesNo("¿Desea quitar de la lista de bajas este afiliado?")) {
		Sql sql(pg_session), sql2(pg_session);
		SqlId ALL("*");
		if (! (SQL * Select(ALL).From(BAJA).Where(NRO_SOCIO_B == lista_bajas.GetKey()))) {
			Exclamation(SQL.GetLastError());
			return;
		}
		while(SQL.Fetch()) {
			if (! (sql * Insert(AFILIADO)(NRO_SOCIO_A,SQL[NRO_SOCIO_B])(BENEFICIO_A,SQL[BENEFICIO_B])(TIPO_SOCIO_A,SQL[TIPO_SOCIO_B])
					(LEY_A,SQL[LEY_B])(SUB_A,SQL[SUB_B])(CDGO_DTO_A,SQL[CDGO_DTO_B])(NRO_AFILIADO_A,SQL[NRO_AFILIADO_B])
					(TIPO_DOC_A,SQL[TIPO_DOC_B])(DNI_A,SQL[DNI_B])(APELLIDOS_A,SQL[APELLIDOS_B])/*(NOMBRES_A,SQL[NOMBRES_B])*/
					(CUOTA_A,SQL[CUOTA_B])(OBSERVACIONES_A,SQL[OBSERVACIONES_B])(FECHA_NAC_A,SQL[FECHA_NAC_B])
					(CALLE_A,SQL[CALLE_B])(NRO_CALLE_A,SQL[NRO_CALLE_B])(PISO_A,SQL[PISO_B])(DPTO_A,SQL[DPTO_B])(BARRIO_A,SQL[BARRIO_B])
					(CIUDAD_A,SQL[CIUDAD_B])(TEL_A,SQL[TEL_B])(TEL_ALT_A,SQL[TEL_ALT_B])(MAIL_A,SQL[MAIL_B])
					(REPARTICION_A,SQL[REPARTICION_B])(CARGO_A,SQL[CARGO_B])(CATERORIA_A,SQL[CATERORIA_B])(HABER_A,SQL[HABER_B])
					(MES_ABONO_A,SQL[MES_ABONO_B])(ANIO_ABONO_A,SQL[ANIO_ABONO_B])(FECHA_REGISTRO_A,SQL[FECHA_REGISTRO_B]))) {
				Exclamation(sql.GetLastError());
				return;
			}
			if (! (sql2 * Delete(BAJA).Where(NRO_SOCIO_B == lista_bajas.GetKey()))) {
				Exclamation(sql2.GetLastError());
				return;
			}
		}
		lista_bajas.Query();
		lista_bajas.GoEndPostQuery();
	}
	HabilitarBotones();
}

/**
 Opción para limpiar la lista de bajas.
*/
void BajaAfiliadoMes::LimpiarLista()
{
	if (PromptYesNo("¿Quiere limpiar el archivo de bajas? NO se puede revertir la decisión.")) {
		if (! (SQL * Delete(BAJA))) {
			Exclamation(SQL.GetLastError());
			return;
		}
		PromptOK("El archivo de bajas se ha limpiado correctamente");
		lista_bajas.Query();
		lista_bajas.GoEndPostQuery();
	}
	HabilitarBotones();
}

/**
 Función para habilitar los botones de exportar, quitar y limpiar.
*/
void BajaAfiliadoMes::HabilitarBotones()
{
	if (lista_bajas.Get(0,0).IsNull()) {
		exportar_btn.Disable();
		quitar_afiliado_btn.Disable();
		limpiar_btn.Disable();
	}
	else {
		exportar_btn.Enable();
		quitar_afiliado_btn.Enable();
		limpiar_btn.Enable();
	}
}

/**
 Opción para salir de la ventana de bajas.
*/
void BajaAfiliadoMes::Salir()
{
	Hide();
	Close();
}